#ifndef __THREAD_SAFE_PRINTER__
#define __THREAD_SAFE_PRINTER__

#include <iostream>
#include <mutex>
#include <sstream>

// 线程安全的打印函数类
class ThreadSafePrinter
{
public:
    // 打印函数，使用互斥量保护
    template<typename... Args>
    static void print(const char* format, Args&&... args)
    {
        std::lock_guard<std::mutex> lock(mutex);  // 在函数作用域内锁住互斥量，自动释放锁
        print_impl(format, std::forward<Args>(args)...);
    }

private:
    // 实际打印实现函数，使用 std::ostringstream 格式化打印
    template<typename... Args>
    static void print_impl(const char* format, Args&&... args)
    {
        std::ostringstream oss;
        print_format(oss, format, std::forward<Args>(args)...);
        std::cout << oss.str() << std::endl;
    }

    // 格式化打印参数
    template<typename T, typename... Rest>
    static void print_format(std::ostringstream& oss, const char* format, T&& arg, Rest&&... rest)
    {
        while(*format) {
            if(*format == '%' && *(format + 1) != '%') {
                oss << arg;
                print_format(oss, format + 2, std::forward<Rest>(rest)...);
                return;
            }
            oss << *format++;
        }
    }

    // 递归展开结束条件
    static void print_format(std::ostringstream& oss, const char* format)
    {
        while(*format) {
            oss << *format++;
        }
    }

private:
    static std::mutex mutex;  // 静态成员互斥量，所有实例共享
};

#endif
